Tömb feltöltése véletlen számokkal, elrendezése, majd egy bekért szám
keresése a tömbben bináris kereséssel, eljárások használatával (BinarisKereses.pas)
program BinarisKereses; uses crt; var i,i0,i1,i2,t,sz,x,j,n:integer;
a:array [1..100] of integer;
procedure tombfeltoltes;
begin i:=1; write('Hany darab szam legyen a tombben? '); readln(n);
while(i<=n) do begin a[i]:=trunc((10)*random+1); i:=i+1; end;
end;
procedure rendezes;
Legkisebb alapján történő rendezéssel elrendezzük a tömb elemeit.
begin i:=1; while(i<n) do begin
j:=i+1; while(j<=n) do begin if (a[j]<a[i]) then begin x:=a[j];
a[j]:=a[i]; a[i]:=x; end; j:=j+1; end; i:=i+1; end;
writeln('A szamok rendezes utan:'); i:=1; while(i<=n) do begin
writeln('A tomb ',i,'. eleme: ',a[i]); i:=i+1; end; end;
procedure kereses; begin t:=0; write('A keresett szam: ');
readln(sz);
Bekérjük a keresett számot.
i1:=1;
i1-be eltároljuk a tömb első elemének indexét, azaz 1-et.
i2:=n;
i2-be eltároljuk a tömb utolsó elemének indexét, azaz n-et.
while(i1<=i2) do begin i:=trunc((i1+i2)/2);
i-be beletesszük a középső elem indexét, amelyet az i1 és i2 aktuális értékének átlagaként kapunk meg. Mivel nem egész számot kapunk, típuskényszertéssel egész számmá alaktíjuk az átlagot.
if (a[i]=sz) then break;
Ha a tömb i-edik eleme megyegyezik a számmal, azaz találatunk van break-el kilépünk a ciklusból.
if (sz<a[i]) then begin
Ha a tömb i-edik eleme kisebb, mint a keresett szám, akkor már csak az i-edik elem után találhatjuk meg a számunkat, mivel a tömb elemeit elrendeztük. Ha az elem nagyobb a keresett számnál, akkor pedig már csak az i-edik elem előtti számok között keresünk tovább.
i2:=i-1; end
else i1:=i+1; end;
i0:=i;
i0-ba eltároljuk az i aktuális értékét
while (i1<=i) do begin
A ciklus segítségével megvizsgáljuk, hogy az i-edik tömbelem előtti számok között van e találat, ha igen, kiírjuk a találat indexét, és a találatok számát növeljük eggyel, majd az i értékét csökkentjük eggyel, így vizsgálva a további elemeket. Ha nincs találatunk break-kel kilépünk a ciklusból.
if (a[i]=sz)
then begin writeln('A talalat a sorozat ',i,'. eleme'); t:=t+1;
i:=i-1; end else break; end;
i:=i0+1;
i-be beletesszük az i0-nál eggyel nagyobb értéket. Erre azért van szükség, mert miután az előző ciklus lefutott, már csak az i0-adik tömbelem után lehet találatunk.
while (i<=i2) do begin
A ciklus segítségével megvizsgáljuk, hogy az i-edik tömbelem utáni számok között van e találat, ha igen, kiírjuk a találat indexét, és a találatok számát növeljük eggyel, majd az i értékét is növeljüks eggyel, így vizsgálva a további elemeket. Ha nincs találatunk break-kel kilépünk a ciklusból.
if (a[i]=sz) then begin writeln('A talalat a sorozat ',i,'.
eleme'); t:=t+1; i:=i+1; end else break; end;
if
(t=0) then writeln ('Nincs talalat.')
Ha a találatok száma , akkor kiírjuk, hogy Nincs találat, egyébként pedig kiírjuk a találatok számát.
else writeln('A talalatok szama:
',t); end;
BEGIN clrscr; tombfeltoltes; rendezes;
kereses; END.
|